/**
 * 实用工具合集，其它同目录文件为，子集的拆分
 * @type {{Cookie: {setCookie: (function(*, *=): boolean), getCookie: UtilityTools.Cookie.getCookie}, Validate: {isTxtNum: (function(*=, *): boolean), isNum: (function(*=): boolean), isCardNo: (function(*=): boolean), isEmail: (function(*=): boolean), isMobile: (function(*=): boolean), isNumFloat: (function(*=): boolean)}, Tools: {request: UtilityTools.Tools.request, enterKeydown: UtilityTools.Tools.enterKeydown, revertDownloadUrl: (function(*): string[]), strToArray: (function(*, *=): []), getCheckedBoxListVal: (function(*, *): any), showValidatePrompt: UtilityTools.Tools.showValidatePrompt}, Submit: {is_layer_load: boolean, saveData: UtilityTools.Submit.saveData, is_debug: boolean}, FormValidate: (function(*=): boolean)}}
 */
var UtilityTools = {
    /**
     * 时间处理工具库
     *
     */
    Date: {
        /**
         *
         * 获取当前时间
         *
         * @returns {string}
         */
        getNowTime: function (){

            return ((new Date()).toLocaleString()).replace('/','-');
        }
    },
    /**
     * 工具库
     */
    Tools : {
        /**
         * 复制字符串
         * [主动触发]
         * @private
         */
        toCopyStr: function(str) {
            var input = document.createElement("input");
            input.type = 'text';
            input.value = str;
            input.style = 'width:100px;position:absolute;opacity: 0;';
            input.readOnly = true; //在ios上必须加上
            document.body.appendChild(input);
            input.select();
            input.setSelectionRange(0, input.value.length);
            let res = document.execCommand('Copy');
            document.body.removeChild(input);
        },
        /**
         * 获取选中的值
         * @param isArray 返回 array | string
         * @returns {any}
         */
        getCheckedBoxListVal: function (obj, isArray) {
            var ids = "";
            $(obj?obj:".list-check-box").each(function(a, b){
                if($(b).is(":checked")){
                    if(ids == ""){
                        ids += ""+$(b).val();
                    }else{
                        ids += ","+$(b).val();
                    }
                }
            });
            return true===isArray?ids.split(","):ids;
        },
        /**
         * 弹出带计算规则的验证码对话框
         * @param callBack
         */
        showValidatePrompt: function (callBack) {
            var start_num = Math.floor(Math.random() * 10);
            var end_num = Math.floor(Math.random() * 10);

            layer.prompt({
                title: start_num+"*"+end_num+"=？ 请输入计算结果。",
                formType: 0, //输入框类型，支持0（文本）默认1（密码）2（多行文本）
                value: "", //初始时的值，默认空字符
                maxlength: 10, //可输入文本的最大长度，默认500
            }, function (value, index, elem) {
                if(start_num*end_num != 1*value){
                    return layer.alert("输入错误");
                }
                if(typeof callBack == "function"){
                    callBack();
                }
                layer.close(index);
            });
        },

        /**
         * 回车键按下确认
         */
        enterKeydown: function(ele){
            if (event.keyCode == 13){
                $(ele).submit();
            }
        },
        /**
         * 常规请求
         * @param url
         * @param data
         * @param callBack
         */
        request: function (url, data, callBack) {
            $.post(url, data, function (res) {
                if(typeof callBack == "function"){
                    return callBack(res);
                }
                if(res.code == 1){
                    return  $.msg.error(res.msg);
                }
                $.msg.success(res.msg);
                return $.form.reload();
            }, "json");
        },
        /**
         * 将key=val;key1=val1 或 key=val&key1=val1格式的字符串转换为二维数组
         **/
        strToArray : function(uri, str){
            if(!str)str = ";";//拆分符号
            var spl_arr = uri.split(str);

            var res_arr = [];//存储结果
            for(var i=0; i<spl_arr.length; i++){
                var tmparr = spl_arr[i].split("=");
                res_arr[i] = tmparr;
            }
            return res_arr;
        },
        /**
         * 转换下载地址,把完整文件下载地址分割为前缀和文件名
         * @param file_download_url eg：http://www.down.com/file/abc.mp4
         * @returns {[string, string]} ["http://www.down.com/file/", "abc.mp4"]
         */
        revertDownloadUrl: function (file_download_url) {
            var last_index = file_download_url.lastIndexOf("/");
            //前缀
            var frefix = file_download_url.substr(0, last_index+1);
            //资源文件名称
            var file_name = file_download_url.substr(last_index+1);
            return [frefix, file_name];
        },

    },
    /**
     * 缓存库
     */
    Cookie : {
        /**
         * 设置cookie
         **/
        setCookie : function(key, val){
            document.cookie = key+'='+encodeURIComponent(val);
            return true;
        },

        /**
         * 获取cookie[仅返回有效数据]
         **/
        getCookie : function(key){
            //假设存储格式是：key=val;key1=val1
            var cook_arr = document.cookie.split(';');

            //验证一下,没有值就返回false，不进入下一个流程
            if(!cook_arr)return false;

            var res_arr = [];//存储解析结果
            for(var i=0; i<cook_arr.length; i++){
                //这里要再解析一次
                var arr = cook_arr[i].split('=');
                //这里表示满足key=val格式
                if(arr && arr.length==2)res_arr.push ([arr[0].trim(),decodeURIComponent(arr[1].trim())]);//存储
            }
            if(key){
                for(var j=0; j<res_arr.length; j++){
                    if(key == res_arr[j][0])return res_arr[j][1];//返回正确val
                }
            }else{
                return res_arr;//key不存在就返回所有，有时候还是想看看所有的值
            }
            //默认返回false 表示没有取到值
            return false;
        },
    },
    /**
     * 提交库
     */
    Submit : {
        is_debug: true,
        is_layer_load: true,//显示加载层
        //单表单
        saveData: function(obj, fn){
            var form = ($(obj).length==1 && $(obj)[0].tagName.toLowerCase()=='form')?obj:$(obj).parents("form");
            if(form.length !== 1){
                return console.log("表单不存在");
            }

            var url = $(form).attr("action");
            if(!url){
                return console.log("请求url不存在");
            }
            var data = $(form).serializeArray();
            if(this.is_debug){
                console.log(data);
            }

            if(data.length === 0){
                return console.log("提交空数据");
            }
            var that = this;


            //遮罩
            if(that.is_layer_load){
                var load_index = layer.load(1);
            }
            $.post(url, data, function (res) {
                if(that.is_debug){
                    console.log(res);
                }
                //取消遮罩
                if(that.is_layer_load){
                    layer.close(load_index);
                }
                //处理
                if(fn) fn(res);
            }, "json");


        },
        //多表单
        //todoing
    },
    /**
     * 验证库
     */
    Validate : {
        /**
         * 验证身份证
         * @param card
         * @returns {boolean}
         */
        isCardNo : function(card) {
            var pattern = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
            return pattern.test(card);
        },
        /**
         * 验证手机
         * @param mobile
         * @returns {*|boolean}
         */
        isMobile:function(mobile){
            var mobreg = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1})|(17[0-9]{1}))+\d{8})$/;
            return mobreg.test(mobile);
        },
        /**
         * 自写验证邮箱
         * @param p
         * @returns {*|boolean}
         */
        isEmail:function (p) {
            return /^([A-Z|a-z|0-9|\D]*)@([a-z|A-Z|0-9]*).[a-z|A-Z]*$/.test(p);
        },
        /**
         * 检查是否是字母或（和）数字
         * @param p
         * @param type 为 true 则包含特殊字符 否则不包含
         * @returns {*|boolean}
         */
        isTxtNum:function (p, type) {
            return type?/^[A-Z|a-z|0-9]|[.~@#%&_-]+$/.test(p):/^([A-Z|a-z|0-9])+$/.test(p);
        },
        /**
         * 数字
         * @param p
         * @returns {boolean}
         */
        isNum:function (p) {
            return /^\d+$/.test(p);
        },
        /**
         * 小数
         * @param p
         * @returns {boolean}
         */
        isNumFloat:function (p) {
            return /^([1-9][0-9]*|0)(\.[0-9]+)?$/.test(p);
        },
    },
    /**
     * 表单库
     */
    Form: {
        /**
         * [公共]表单验证库
         * 元素框变红
         * @param form
         * @returns {boolean}
         */
        FormValidate:function (form) {
            let tips = function (msg, ele) {
                layer.tips(msg, ele);
                $(ele).css({"border":"1px solid red"});
            };

            //失去焦点提示
            let blur = function (o, ele) {
                $(o).bind("blur",function () {
                    //元素警告样式
                    if($(ele).val()!="")$(ele).css({"border":0});
                    else {
                        tips("这里必须哦", ele);
                        $(ele).css({"border":"1px solid red"});
                    }
                });
            };

            var r = true;
            $(form).find("*").each(function (k, o) {
                var ele_val = $(o).val();
                var attr = $(o).attr("data-validate");
                if(attr){
                    $(o).addClass("tips_"+k);//临时class
                    var ele = ".tips_"+k;
                    if(attr == "require"){
                        if(ele_val == ""){
                            tips("这里必须哦", ele);//根据临时class处理后续css逻辑
                            blur(o, ele);
                            r = false;//指定返回结果
                            return false;//退出循环
                        }
                    }else if(attr == "mobile"){
                        if(false === UtilityTools.Validate.isMobile(ele_val)){
                            tips("这里是手机号哦", ele);
                            blur(o, ele);
                            r = false;//指定返回结果
                            return false;
                        }

                    }else if(attr == "number"){
                        if(false === /^\d*$/.test(ele_val)){
                            tips("这里是数字哦", ele);
                            blur(o, ele);
                            r = false;//指定返回结果
                            return false;
                        }
                    }else if(attr == "birthday"){
                        //to do ...

                    }else if(attr == "date"){
                        //验证日期格式
                        //to do...

                    }else if(attr == "email"){
                        if(false === UtilityTools.Validate.isEmail(ele_val)){
                            tips("这里是邮箱哦", ele);
                            blur(o, ele);
                            r = false;//指定返回结果
                            return false;
                        }
                    }else if(attr == "txtnum"){
                        //字母+数字
                        if(false === UtilityTools.Validate.isTxtNum(ele_val)){
                            tips("这里是字母和（或）数字哦", ele);
                            blur(o, ele);
                            r = false;//指定返回结果
                            return false;
                        }
                    }else if(attr == "card"){
                        if(false === UtilityTools.Validate.isCardNo(ele_val)){
                            tips("这里是身份证哦", ele);
                            blur(o, ele);
                            r = false;//指定返回结果
                            return false;
                        }
                    }
                }
            });
            return r;
        },

        /**
         * [公共]表单验证
         * 元素框底部边框变红、前面字段名称变红
         * @param form
         * @returns {boolean}
         */
        FormValidateBS:{
            /**
             * 将元素底部边框变红
             * @param ele
             */
            warningInput: function(ele){

                $(ele).css({'border-bottom':'1px solid #e73d4a'});
            },
            /**
             * 将文本文字变红
             * @param ele
             */
            warningText: function (ele) {
                $(ele).parent().prev('label').css({'color':'#e73d4a'});
            },
            validate (form) {
                let that = this;

                let onkeydown = function (ele) {
                    $(ele).bind("keyup",function () {
                        $(ele).css({'border-bottom':'1px solid #c2cad8'});
                        $(ele).parent().prev('label').css({'color':'#888'});
                    });
                };
                var r = true;
                $(form).find("*").each(function (k, o) {
                    var ele_val = $(o).val();
                    var attr = $(o).attr("data-validate");
                    if(attr){
                        if(attr == "require"){
                            if(ele_val == ""){
                                that.warningInput(o);
                                that.warningText(o);
                                onkeydown(o);
                                r = false;//指定返回结果
                                return false;//退出循环
                            }
                        }else if(attr == "mobile"){
                            if(false === UtilityTools.Validate.isMobile(ele_val)){
                                that.warningInput(o);
                                that.warningText(o);
                                onkeydown(o);
                                r = false;//指定返回结果
                                return false;
                            }

                        }else if(attr == "number"){
                            if(false === /^\d*$/.test(ele_val)){
                                that.warningInput(o);
                                that.warningText(o);
                                onkeydown(o);
                                r = false;//指定返回结果
                                return false;
                            }
                        }else if(attr == "birthday"){
                            //to do ...

                        }else if(attr == "date"){
                            //验证日期格式
                            //to do...

                        }else if(attr == "email"){
                            if(false === UtilityTools.Validate.isEmail(ele_val)){
                                that.warningInput(o);
                                that.warningText(o);
                                onkeydown(o);
                                r = false;//指定返回结果
                                return false;
                            }
                        }else if(attr == "txtnum"){
                            //字母+数字
                            if(false === UtilityTools.Validate.isTxtNum(ele_val)){
                                that.warningInput(o);
                                that.warningText(o);
                                onkeydown(o);
                                r = false;//指定返回结果
                                return false;
                            }
                        }else if(attr == "card"){
                            if(false === UtilityTools.Validate.isCardNo(ele_val)){
                                that.warningInput(o);
                                that.warningText(o);
                                onkeydown(o);
                                r = false;//指定返回结果
                                return false;
                            }
                        }else if(attr == "tel"){
                            if(false === UtilityTools.Validate.isMobile(ele_val)){
                                that.warningInput(o);
                                that.warningText(o);
                                onkeydown(o);
                                r = false;//指定返回结果
                                return false;
                            }
                        }
                    }
                });
                return r;
            },
        },
    },

};